package main

import "fmt"

// 接口的定义：定义规则、定义规范，定义某种能力：
type SayHello interface {
	//声明没有实现的方法：
	sayHello()
}

// 接口的实现：定义一个结构体：
// 中国人：
type Chinese struct {
	name string
}

// 实现接口的方法---》具体的实现：
func (person Chinese) sayHello() {
	fmt.Println("你好")
}

// 中国人特有的方法
func (person Chinese) niuYangGe() {
	fmt.Println("东北文化-扭秧歌")
}

// 接口的实现：定义一个结构体：
// 美国人：
type American struct {
	name string
}

// 实现接口的方法---》具体的实现：
func (person American) sayHello() {
	fmt.Println("hi")
}

// 定义一个函数：专门用来各国人打招呼的函数，接收具备SayHello接口的能力的变量：
func greet(s SayHello) {
	s.sayHello()
	//断言：
	var ch Chinese = s.(Chinese) //看s是否能转成Chinese类型并且赋给ch变量
	ch.niuYangGe()
}
func main() {

	//创建一个中国人：
	c := new(Chinese)
	//创建一个美国人：
	//a := American{}
	//美国人打招呼：
	//greet(a)
	//中国人打招呼：
	greet(*c)
}
